package org.dezenho.client.IU;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

import org.dezenho.client.SO.DezenhoClient;
import org.dezenho.common.RMI.ServerInterface;

/** Classe responsavel pela interface com o Adivinhador e acoes associadas a ele.
 * Esta classe herda configuracoes da GenericTela e implementa a Interface do padrao
 * Observer.
 * @author dafneguisard
 *
 */
public class Adivinhador extends GenericTela implements AdivinhadorObserver  {


	private Point[] desenhoObserverState;
	private int tempoRestanteObserverState;
	private static final long serialVersionUID = 1L;
	private JDesktopPane jDesktopPane = null;
	private JButton jButton = null;
	private JTextField jTextField = null;
	private JLabel jLabel = null;
	private JLabel jLabel1 = null;
	private JLabel jLabel2 = null;
	private JLabel jLabel3 = null;
	private JLabel jLabel4 = null;
	private JPanel jPanel = null;
	private JLabel jLabel5 = null;
	private ServerInterface server;  //  @jve:decl-index=0:
	private org.dezenho.client.RN.Adivinhador adivinhador;  //  @jve:decl-index=0:
	
	/**
	 * Construtor, associa o Adivinhador Observer (attached)
	 *
	 */
	public Adivinhador() {
		super();
		setAdivinhador(DezenhoClient.getInstance().getAdivinhador());
		DezenhoClient.getInstance().getAdivinhador().setAdivinhadorObserver(this);
	}
	/**
	 * Metodo para criar a tela do Adivinhador
	 * Implementa tambem a acao de desconectar o usuario do servidor quando a janela e fechada
	 * @param tempoTotal
	 * @param multiplicador
	 */
	public void criaTela(int tempoTotal, int multiplicador) {
		super.criaTela();
		this.setContentPane(getJDesktopPane());
		this.setTitle("Adivinhador");
		this.getJLabel4().setText(String.valueOf(multiplicador));
		this.getJLabel2().setText(String.valueOf(tempoTotal));
	}
	/**
	 * Metodo que repinta o desenho atualizado no painel
	 *da tela do adivinhador
	 */
	public void exibeDesenhoAtualizado(){
		getJPanel().repaint();
	}
	
	/**
	 * Metodo que exibe o tempo restante atualizado
	 *@param temporestante
	 */
	public void atualizaTempoRestante(int tempoRestante){
		getJLabel2().setText(String.valueOf(tempoRestante));
	}
	
	/**
	 * Metodo do padrao Observer para atualizacao do tempo e desenho 
	 * que serao exibidos na tela do adivinhador
	 *
	 */
	public void updateTempoDesenho(){
		setTempoRestanteObserverState(getAdivinhador().getTempoRestante());
		setDesenhoObserverState(getAdivinhador().getDesenho());	
		exibeDesenhoAtualizado();
		atualizaTempoRestante(getTempoRestanteObserverState());	
	}
	
	/**
	 *Metodo que coleta palavra digitada no campo de texto da tela 
	 *
	 */
	public String coletaPalavra(){
		return getJTextField().getText();
	}
	/**
	 * Metodo responsavel por enviar a palavra coletada para verificar se
	 *houve acerto deste adivinhador
	 */
	public void submetePalavra(){
		getAdivinhador().verificaPalavraEnviada(coletaPalavra());
	}
	
//Metodos de acesso
	private JDesktopPane getJDesktopPane() {
		if (jDesktopPane == null) {
			jLabel5 = new JLabel();
			getJLabel5().setBounds(new Rectangle(143, 17, 279, 97));
			getJLabel5().setIcon(getLogo());
			jLabel4 = new JLabel();
			getJLabel4().setBounds(new Rectangle(264, 571, 20, 26));
			getJLabel4().setFont(new Font("Arial", Font.PLAIN, 14));
			jLabel3 = new JLabel();
			getJLabel3().setBounds(new Rectangle(159, 569, 100, 29));
			getJLabel3().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel3().setText("Multiplicador:");
			jLabel2 = new JLabel();
			getJLabel2().setBounds(new Rectangle(72, 568, 40, 30));
			getJLabel2().setFont(new Font("Arial", Font.PLAIN, 14));
			jLabel1 = new JLabel();
			getJLabel1().setBounds(new Rectangle(9, 568, 62, 32));
			getJLabel1().setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
			getJLabel1().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel1().setText("Tempo:");
			jLabel = new JLabel();
			getJLabel().setBounds(new Rectangle(8, 606, 72, 35));
			getJLabel().setFont(new Font("Arial", Font.BOLD, 14));
			getJLabel().setText("Resposta:");
			jDesktopPane = new JDesktopPane();
			jDesktopPane.setBackground(Color.white);
			jDesktopPane.add(getJButton(), null);
			jDesktopPane.add(getJTextField(), null);
			jDesktopPane.add(jLabel, null);
			jDesktopPane.add(jLabel1, null);
			jDesktopPane.add(jLabel2, null);
			jDesktopPane.add(jLabel3, null);
			jDesktopPane.add(jLabel4, null);
			jDesktopPane.add(getJPanel(), null);
			jDesktopPane.add(jLabel5, null);
		}
		return jDesktopPane;
	}

	/**
	 * Metodo de acesso ao JButton associa a acao do botao ao metodo de submeter
	 *palavra para posterior verificacao de acerto
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(377, 607, 90, 31));
			jButton.setFont(new Font("Arial", Font.BOLD, 12));
			jButton.setText("Enviar");
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					submetePalavra();
					getJTextField().setText("");
				}
			});
		}
		return jButton;
	}
	/**
	 * Metodo de acesso ao JTextField associa a acao de pressionar enter ao metodo de submeter
	 *palavra para posterior verificacao de acerto.
	 *Apos submeter a palavra o campo de texto e limpo
	 */
	private JTextField getJTextField() {
		if (jTextField == null) {
			jTextField = new JTextField();
			jTextField.setBounds(new Rectangle(83, 609, 283, 30));
			jTextField.setFont(new Font("Arial", Font.PLAIN, 14));
			jTextField.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					getAdivinhador().verificaPalavraEnviada(((JTextField)(e.getSource())).getText());
					getJTextField().setText("");
				}
			});
		}
		return jTextField;
	}
	/**
	 * Metodo de acesso ao JPanel tambem repinta o desenho atualizado
	 *
	 */
	@SuppressWarnings("serial")
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel(){
				public void paintComponent(Graphics g){
					super.paintComponent(g); //Limpa a area do desenho
					//Desenha todos os pontos com ovais
					if(getDesenhoObserverState() != null){
						for(Point ponto : getDesenhoObserverState()){
							if(ponto!=null)
								g.fillOval(ponto.x, ponto.y, 10, 10);
						}
					}
				}
			};
			jPanel.setLayout(new GridBagLayout());
			jPanel.setBorder(new LineBorder(Color.RED));
			jPanel.setBounds(new Rectangle(11, 144, 543, 408));
		}
		return jPanel;
	}

//	metodos de acesso
	public Point[] getDesenhoObserverState() {
		return desenhoObserverState;
	}

	public void setDesenhoObserverState(Point[] desenhoObserverState) {
		this.desenhoObserverState = desenhoObserverState;
	}

	public int getTempoRestanteObserverState() {
		return tempoRestanteObserverState;
	}

	public void setTempoRestanteObserverState(int tempoRestanteObserverState) {
		this.tempoRestanteObserverState = tempoRestanteObserverState;
	}
	public org.dezenho.client.RN.Adivinhador getAdivinhador() {
		return adivinhador;
	}
	public void setAdivinhador(org.dezenho.client.RN.Adivinhador adivinhador) {
		this.adivinhador = adivinhador;
	}
	public JLabel getJLabel() {
		return jLabel;
	}

	public void setJLabel(JLabel label) {
		jLabel = label;
	}

	public JLabel getJLabel1() {
		return jLabel1;
	}

	public void setJLabel1(JLabel label1) {
		jLabel1 = label1;
	}

	public JLabel getJLabel2() {
		return jLabel2;
	}

	public void setJLabel2(JLabel label2) {
		jLabel2 = label2;
	}

	public JLabel getJLabel3() {
		return jLabel3;
	}

	public void setJLabel3(JLabel label3) {
		jLabel3 = label3;
	}

	public JLabel getJLabel4() {
		return jLabel4;
	}

	public void setJLabel4(JLabel label4) {
		jLabel4 = label4;
	}

	public JLabel getJLabel5() {
		return jLabel5;
	}

	public void setJLabel5(JLabel label5) {
		jLabel5 = label5;
	}

	public ServerInterface getServer() {
		return server;
	}

	public void setServer(ServerInterface server) {
		this.server = server;
	}
}  
